#include "manager.h"
#include <fstream>
#include <iostream>
#include <sstream>
#include <algorithm>
#include "../utils/json.h"

// 构造函数
AssetManager::AssetManager() : nextId(1) {}

// 生成下一个资产ID
int AssetManager::generateNextId() {
    return nextId++;
}

// 获取所有资产
std::vector<Asset> AssetManager::getAllAssets() const {
    return assets;
}

// 根据ID获取资产
bool AssetManager::getAssetById(int id, Asset& asset) const {
    auto it = std::find_if(assets.begin(), assets.end(), [id](const Asset& a) {
        return a.id == id;
    });
    
    if (it != assets.end()) {
        asset = *it;
        return true;
    }
    return false;
}

// 添加新资产
int AssetManager::addAsset(const Asset& asset) {
    Asset newAsset = asset;
    newAsset.id = generateNextId();
    assets.push_back(newAsset);
    return newAsset.id;
}

// 更新资产信息
bool AssetManager::updateAsset(const Asset& asset) {
    auto it = std::find_if(assets.begin(), assets.end(), [&asset](const Asset& a) {
        return a.id == asset.id;
    });
    
    if (it != assets.end()) {
        *it = asset;
        return true;
    }
    return false;
}

// 删除资产
bool AssetManager::deleteAsset(int id) {
    auto it = std::find_if(assets.begin(), assets.end(), [id](const Asset& a) {
        return a.id == id;
    });
    
    if (it != assets.end()) {
        assets.erase(it);
        return true;
    }
    return false;
}

// 获取资产总数
int AssetManager::getAssetCount() const {
    return assets.size();
}

// 从文件加载资产数据
bool AssetManager::loadFromFile(const std::string& filename) {
    std::ifstream file(filename);
    if (!file.is_open()) {
        return false;
    }

    // 读取文件内容
    std::stringstream buffer;
    buffer << file.rdbuf();
    std::string jsonData = buffer.str();
    file.close();

    // 解析JSON数据
    assets = JsonUtils::parseAssets(jsonData);
    
    // 更新nextId
    if (!assets.empty()) {
        int maxId = 0;
        for (const auto& asset : assets) {
            if (asset.id > maxId) {
                maxId = asset.id;
            }
        }
        nextId = maxId + 1;
    }
    
    return true;
}

// 将资产数据保存到文件
bool AssetManager::saveToFile(const std::string& filename) const {
    std::ofstream file(filename);
    if (!file.is_open()) {
        return false;
    }

    // 序列化资产数据为JSON
    std::string jsonData = JsonUtils::serializeAssets(assets);
    file << jsonData;
    file.close();
    
    return true;
}
